"""
使用自定义模块。

注意：确保和定义模块处于同一个package
"""

# 1. 导入模块的代码可以放在任意位置，但一般都放在程序的开头
import custom
import module

# 2. 使用了 __name__ == '__main__' 用于执行测试的 custom 模块，通过 内置函数 dir 可知，没有包含测试相关的变量，如 calculator_sum
print(dir(custom))
# 2.1 没有使用 __name__ == '__main__' 用于执行测试的 module 模块，而是直接再模块中执行测试。通过 内置函数 dir 可知，除了定义的类 Book 和函数
# new_book，还有实例化的 book、实例属性返回的变量 name 以及 函数返回的变量 s
print(dir(module))

# 3. 调用模块中的变量
a = custom.a
print(a)
b = custom.b
print(b)
# 3.1 没有使用 __name__ == '__main__' 用于执行测试，也能调用到模块中用于测试的变量（如何避免请看 custom 模块）
s = module.s
print('模块中测试的变量值：{0}'.format(s))

# 4. 调用模块中的类
book = module.Book('模块中的类实例化')
print(book.get_name())
calculator_sum = custom.Calculator.sum(5, 10)
print(calculator_sum)

# 5. 调用模块中的函数
new_book = module.new_book()
print(new_book)
custom_max = custom.max(5, 10)
print(custom_max)
custom_min = custom.min(8, 3)
print(custom_min)

# 6. 使用模块时，默认 被执行模块 和引入模块的文件在同一 package 下，如果不在同一 package 下，引入模块将会报模块不存在
import sys

# 通过 sys.path 查看模块搜索的路径列表
print(sys.path)

# 6.1 可以通过 sys.path.append() 将需要导入的模块引入到路径列表
# 直接使用 import mod 将会报：ModuleNotFoundError: No module named 'mod' 异常
# import mod

# 可以通过 sys.path.append() 追加模块到路径列表
sys.path.append('C://Users/Steven/Desktop/person/git/study_python/modo')
# 通过打印就知道被加入到了模块路径列表中去了
print(sys.path)
import modo.mod as mod
test = mod.Test()
print(test.name)
print(test.get_name())

# 6.2 其实如果是同一个module下的 package，可以直接通过 from import 来引入模块的。其实上面那个方式主要用于其他项目module，为了演示就使用了
# module 下的 package 来演示
from modo import mod2
test_ = mod2.Test2()
print(test_.name)
print(test_.get_name())
